#include <metal_stdlib>
using namespace metal;

namespace colormap {
namespace IDL {
namespace Standard_Gamma_II {

float colormap_red(float x) {
    if (x < (8.75333333333333E+01 + 2.19676470588235E+02) / (4.76470588235294E+00 + 1.00000000000000E-01)) { // 63.1507456671
        return 4.76470588235294E+00 * x - 2.19676470588235E+02;
    } else if (x < (8.75333333333333E+01 + 3.11000000000000E+02) / (5.00000000000000E+00 + 1.00000000000000E-01)) { // 78.1437908497
        return -1.00000000000000E-01 * x + 8.75333333333333E+01;
    } else if (x < (-3.11000000000000E+02 + 3.42345454545455E+02) / (5.32727272727273E+00 - 5.00000000000000E+00)) { // 95.7777777778
        return 5.00000000000000E+00 * x - 3.11000000000000E+02;
    } else if (x < (255.0 + 3.42345454545455E+02) / 5.32727272727273E+00) { // 112.129692833
        return 5.32727272727273E+00 * x - 3.42345454545455E+02;
    } else if (x < (1.49279020979021E+03 - 255.0) / 7.68531468531468E+00) { // 161.059144677
        return 255.0;
    } else if (x < (1.49279020979021E+03 + 7.19657722738218E+02) / (5.10010319917441E+00 + 7.68531468531468E+00)) { // 173.04463198
        return -7.68531468531468E+00 * x + 1.49279020979021E+03;
    } else if (x < (255.0 + 7.19657722738218E+02) / 5.10010319917441E+00) { // 191.105490355
        return 5.10010319917441E+00 * x - 7.19657722738218E+02;
    } else {
        return 255.0;
    }
}

float colormap_green(float x) {
    if (x < (163.0 + 5.65896810850440E+02) / 5.07239736070381E+00) { // 143.69868112
        return 5.07239736070381E+00 * x - 5.65896810850440E+02;
    } else if (x < (163.0 + 9.06153846153846E+02) / 6.10769230769231E+00) { // 175.050377834
        return 163.0;
    } else {
        return 6.10769230769231E+00 * x - 9.06153846153846E+02;
    }
}

float colormap_blue(float x) {
    if (x < (5.16164662349676E+02 - 4.77795918367347E+00) / (5.20142857142857E+00 + 5.42900092506938E+00)) { // 48.1059305585
        return 5.20142857142857E+00 * x + 4.77795918367347E+00;
    } else if (x < 5.16164662349676E+02 / 5.42900092506938E+00) { // 95.0754419595
        return -5.42900092506938E+00 * x + 5.16164662349676E+02;
    } else if (x < 6.16058823529412E+02 / 4.84558823529412E+00) { // 127.138088012
        return 0.0;
    } else if (x < (9.31184615384615E+02 + 6.16058823529412E+02) / (4.84558823529412E+00 + 5.89230769230769E+00)) { // 144.091863932
        return 4.84558823529412E+00 * x - 6.16058823529412E+02;
    } else if (x < 9.31184615384615E+02 / 5.89230769230769E+00) { // 158.033942559
        return -5.89230769230769E+00 * x + 9.31184615384615E+02;
    } else if (x < 5.64142909048289E+02 / 3.22177684013127E+00) { // 175.103036939
        return 0.0;
    } else {
        return 3.22177684013127E+00 * x - 5.64142909048289E+02;
    }
}

float4 colormap(float x) {
    float t = x * 255.0;
    float r = clamp(colormap_red(t) / 255.0, 0.0, 1.0);
    float g = clamp(colormap_green(t) / 255.0, 0.0, 1.0);
    float b = clamp(colormap_blue(t) / 255.0, 0.0, 1.0);
    return float4(r, g, b, 1.0);
}

} // namespace Standard_Gamma_II
} // namespace IDL
} // namespace colormap
